﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using produccion.clases;
using System.Windows.Input;
using System.Windows;
using System.Collections.ObjectModel;
using System.ComponentModel;
using produccion.modelo;
using produccion.AccesoDatos;
using System.Diagnostics;
using System.Collections.Specialized;
using System.Windows.Controls;
using System.Globalization;
using System.Data;

namespace produccion.vistamodelo
{
    public class VMReporteProduccionCorte : ViewModelBase, IDataErrorInfo
    {
        #region Campos

        private CLSSEMANAS _semana = new CLSSEMANAS();
        private List<CLSPRCPRD> _procesos = new List<CLSPRCPRD>();
        private CLSPRCPRD _selproceso = new CLSPRCPRD();
        private List<CLSREPPRO> _lisReportesCorte = new List<CLSREPPRO>();
        private List<CLSMAEEQU> _equipos = new List<CLSMAEEQU>();
        private CLSMAEEQU _selEquipo = new CLSMAEEQU();
        private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();

        #endregion

        #region Constructor
        public VMReporteProduccionCorte()
        {
            try
            {
                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }
                strTituloVentana = "Reportes de producción" + " - Usuario: " + MDOgeneral.usuario + " - [FrmReporteProduccionCorte]";

                consultarProcesos();
                consultarSemana("S");
                numSemanaActual = semana;

                lisProcesosEspeciales = new CLSPRCESP().listarProcesosEspeciales();
                _buscarProcesosEspeciales = new VMbuscarGeneral((from cust in lisProcesosEspeciales
                                                                 select new VMlistaGenerica { strColumna1 = cust.CODPRC_PES, strColumna2 = cust.NOMPRC_PES }).ToList());
                buscarProcesosEspeciales.PropertyChanged += OnBuscarProcesosEspecialesPropertyChanged;
                buscarProcesosEspeciales.gridBuscar.columna1.strNombre = "Código";
                buscarProcesosEspeciales.gridBuscar.columna2.strNombre = "Nombre";
                lisReportesDeCorte.CollectionChanged += OnCollectionChanged;

                lisEmpleadosConsulta = new CLSMAEEMPP().listaEmpleados();
                _buscarEmpleado = new VMbuscarGeneral((from emp in lisEmpleadosConsulta
                                                       select new VMlistaGenerica { strColumna1 = emp.CODEMP_EMP, strColumna2 = emp.NOMEMP_EMP, strColumna3 = emp.CEDEMP_EMP }).ToList());
                buscarEmpleado.PropertyChanged += OnBuscarEmpleadoPropertyChanged;
                buscarEmpleado.gridBuscar.columna1.strNombre = "Código";
                buscarEmpleado.gridBuscar.columna2.strNombre = "Nombre Empleado";
                buscarEmpleado.gridBuscar.columna3.strNombre = "Cedula Empleado";
                lisempleados.CollectionChanged += OnCollectionChangedEmpleado;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        #endregion

        #region Interfaces publicas  o propiedades

        private int _numRegistro = 0;
        public int numRegistro
        {
            get { return _numRegistro; }
            set { _numRegistro = value; base.OnPropertyChanged("numRegistro"); }
        }

        private string _strOrd = "";
        public string strOrd
        {
            get { return _strOrd; }
            set { _strOrd = value; base.OnPropertyChanged("strOrd"); }
        }

        private string _strTituloVentada;
        public string strTituloVentana
        {
            get { return _strTituloVentada; }
            set { _strTituloVentada = value; base.OnPropertyChanged("strTituloVentana"); }
        }

        public int semana
        {
            get { return _semana.NROSEM_SEM; }
            set
            {
                _semana.NROSEM_SEM = value;
                consultarSemana("S");

                String StrBuscar = _tipoSeleccion.Replace("System.Windows.Controls.ComboBoxItem: ", "");
                if (StrBuscar == "Equipos")
                {
                    consultarEquipos(dtmDesde.Year.ToString(), _semana.NROSEM_SEM.ToString());//FJRF - Se quita del inicio y se pone aca cuando se selecciona el empleado o equipo
                }

                base.OnPropertyChanged("semana");
            }
        }

        public DateTime dtmDesde
        {
            get { return _semana.DESDE_SEM; }
            set { _semana.DESDE_SEM = value; base.OnPropertyChanged("dtmDesde"); }
        }

        public DateTime dtmHasta
        {
            get { return _semana.HASTA_SEM; }
            set { _semana.HASTA_SEM = value; base.OnPropertyChanged("dtmHasta"); }
        }

        private int _numSemanaActual;
        public int numSemanaActual
        {
            get { return _numSemanaActual; }
            set { _numSemanaActual = value; base.OnPropertyChanged("numSemanaActual"); }
        }

        private string _tipoSeleccion = "Empleados";
        public string tipoSeleccion
        {
            get { return _tipoSeleccion; }
            set 
            { 
                _tipoSeleccion = value;
                String StrBuscar = _tipoSeleccion.Replace("System.Windows.Controls.ComboBoxItem: ","");
                if (StrBuscar == "Equipos")
                {
                    consultarEquipos(dtmDesde.Year.ToString(), _semana.NROSEM_SEM.ToString());//FJRF - Se quita del inicio y se pone aca cuando se selecciona el empleado o equipo
                }
                
                base.OnPropertyChanged("tipoSeleccion");
            }
        }
        public List<CLSMAEEQU> equipos
        {
            get { return _equipos; }
            set { _equipos = value; base.OnPropertyChanged("equipos"); }
        }

        public CLSMAEEQU selEquipo
        {
            get { return _selEquipo; }
            set 
            { 
                _selEquipo = value; 
                base.OnPropertyChanged("selEquipo");
                agregarEmpleadosEquipo();
            }
        }

        public List<CLSPRCPRD> procesos
        {
            get { return _procesos; }
            set { _procesos = value; base.OnPropertyChanged("procesos"); }
        }

        public CLSPRCPRD selproceso
        {
            get { return _selproceso; }
            set { _selproceso = value; base.OnPropertyChanged("selproceso"); }
        }

        private decimal _numPorcentajeRegistro = 0;
        public decimal numPorcentajeRegistro
        {
            get { return _numPorcentajeRegistro; }
            set { _numPorcentajeRegistro = value; base.OnPropertyChanged("numPorcentajeRegistro"); }
        }

        private double _numTotalOrdenes = 0;
        public double numTotalOrdenes
        {
            get { return _numTotalOrdenes; }
            set 
            { 
                _numTotalOrdenes = value; 
                base.OnPropertyChanged("numTotalOrdenes");
                if (numTotalOrdenes > 0)
                {
                    if (selproceso != null)
                    {
                        if (selproceso.CODPRC_PPR != null)
                            logValido = true;
                    }
                }
                else
                    logValido = false;
            }
        }

        private Int32 _numControlGrid = 0;
        public Int32 numControlGrid
        {
            get { return _numControlGrid; }
            set { _numControlGrid = value; base.OnPropertyChanged("numControlGrid"); }
        }

        private ObservableCollection<VMReportesCorte> _lisReportesDeCorte = new ObservableCollection<VMReportesCorte>();
        public ObservableCollection<VMReportesCorte> lisReportesDeCorte
        {
            get { return _lisReportesDeCorte; }
            set { _lisReportesDeCorte = value; base.OnPropertyChanged("lisReportesDeCorte"); }
        }

        private VMReportesCorte _selReportesDeCorte;
        public VMReportesCorte selReportesDeCorte
        {
            get { return _selReportesDeCorte; }
            set { _selReportesDeCorte = value; base.OnPropertyChanged("selReportesDeCorte"); }
        }

        private ObservableCollection<VMEmpleados> _lisempleados = new ObservableCollection<VMEmpleados>();
        public ObservableCollection<VMEmpleados> lisempleados
        {
            get { return _lisempleados; }
            set { _lisempleados = value; base.OnPropertyChanged("lisempleados"); }
        }

        private VMEmpleados _selempleados;
        public VMEmpleados selempleados
        {
            get { return _selempleados; }
            set { _selempleados = value; base.OnPropertyChanged("selempleados"); }
        }

        private int _numIndexEmp = 0;
        public int numIndexEmp
        {
            get { return _numIndexEmp; }
            set { _numIndexEmp = value; base.OnPropertyChanged("numIndexEmp"); }
        }

        private DataTable _dtReportados = new DataTable();
        public DataTable dtReportados
        {
            get { return _dtReportados; }
            set { _dtReportados = value; base.OnPropertyChanged("dtReportados"); }
        }

        private List<CLSPRCESP> lisProcesosEspeciales = new List<CLSPRCESP>();
        private List<CLSMAEEMPP> lisEmpleadosConsulta = new List<CLSMAEEMPP>();

        public List<CLSMAEEMPP> lisempleadosequipo ;

        public List<CLSREPPRO> lisReportesCorte
        {
            get { return _lisReportesCorte; }
            set { _lisReportesCorte = value; base.OnPropertyChanged("lisReportesCorte"); }
        }

        private VMbuscarGeneral _buscarProcesosEspeciales;
        public VMbuscarGeneral buscarProcesosEspeciales
        {
            get { return _buscarProcesosEspeciales; }
            set { _buscarProcesosEspeciales = value; base.OnPropertyChanged("buscarProcesosEspeciales"); }
        }
        private VMbuscarGeneral _buscarEmpleado;
        public VMbuscarGeneral buscarEmpleado
        {
            get { return _buscarEmpleado; }
            set { _buscarEmpleado = value; base.OnPropertyChanged("buscarEmpleado"); }
        }
        private Boolean _logValido;
        public Boolean logValido
        {
            get { return _logValido; }
            set { _logValido = value; base.OnPropertyChanged("logValido"); }
        }
        private MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msn
        {
            get { return _msn; }
            set { _msn = value; base.OnPropertyChanged("msn"); }
        }
        private Int32 _numConsecutivo = 0;
        public Int32 numConsecutivo
        {
            get { return _numConsecutivo; }
            set { _numConsecutivo = value; base.OnPropertyChanged("numConsecutivo"); }
        }

        private Int32 _numConsecutivoEmp = 0;
        public Int32 numConsecutivoEmp
        {
            get { return _numConsecutivoEmp; }
            set { _numConsecutivoEmp = value; base.OnPropertyChanged("numConsecutivoEmp"); }
        }

        private string _strNumerodeOrden = "";
        public string strNumerodeOrden
        {
            get { return _strNumerodeOrden; }
            set
            {
                _strNumerodeOrden = value;
                base.OnPropertyChanged("strNumerodeOrden");
                if (strNumerodeOrden != null)
                {
                    if (strNumerodeOrden.Length > 4)
                    {
                        ConsultarOrdenOProcesoEspecial();
                    }
                    else
                        dtReportados.Clear();
                }
            }
        }

        private string _strReferencia = "";
        public string strReferencia
        {
            get { return _strReferencia; }
            set { _strReferencia = value; base.OnPropertyChanged("strReferencia"); }
        }

        private string _strColor = "";
        public string strColor
        {
            get { return _strColor; }
            set { _strColor = value; base.OnPropertyChanged("strColor"); }
        }

        private Int32 _numTotalOrden = 0;
        public Int32 numTotalOrden
        {
            get { return _numTotalOrden; }
            set { _numTotalOrden = value; base.OnPropertyChanged("numTotalOrden"); }
        }

        private double _numPendiente = 0;
        public double numPendiente
        {
            get { return _numPendiente; }
            set { _numPendiente = value; base.OnPropertyChanged("numPendiente"); }
        }

        private double _numAReportar = 0;
        public double numAReportar
        {
            get { return _numAReportar; }
            set 
            { 
                _numAReportar = value; 
                base.OnPropertyChanged("numAReportar");
                if (numAReportar > 0)
                {
                    if (numAReportar > numPendiente)
                    {
                        MessageBox.Show("No se puede reportar mas de lo que hay pendiente.", "Inconsistencia en la cantidad a reportar", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                    }
                }
            }
        }

        private double _numAReportar2 = 0;
        public double numAReportar2
        {
            get { return _numAReportar2; }
            set 
            { 
                _numAReportar2 = value; 
                base.OnPropertyChanged("numAReportar2");
                if (numAReportar2 > 0)
                {
                    if (numAReportar2 <= numPendiente && logAgregaReporte==true)
                    {
                        agregarAReportes();
                        var numTot = lisReportesDeCorte.Where(x => !String.IsNullOrEmpty(x.NROORD_RPP)).Sum(y => y.CANREP_RPP);
                        numTotalOrdenes = Convert.ToInt32(numTot);
                        limpiartextos();
                        logAgregaReporte = false;
                        strNumerodeOrden = "";
                        dtReportados.Clear();

                    }
                }
            }
        }

        private Boolean _logAgregaReporte=false;
        public Boolean logAgregaReporte
        {
            get { return _logAgregaReporte; }
            set { _logAgregaReporte = value; base.OnPropertyChanged("logAgregaReporte"); }
        }

        private Boolean _logModificar = false;
        public Boolean logModificar
        {
            get { return _logModificar; }
            set { _logModificar = value; base.OnPropertyChanged("logModificar"); }
        }

        #endregion

        #region Comandos
        RelayCommand _cmdNuevo;
        public ICommand cmdNuevo
        {
            get
            {
                if (_cmdNuevo == null)
                {
                    _cmdNuevo = new RelayCommand(x => nuevoReporte());
                }
                return _cmdNuevo;
            }
        }

        RelayCommand _cmdGuardar;
        public ICommand cmdGuardar
        {
            get
            {
                if (_cmdGuardar == null)
                {
                    _cmdGuardar = new RelayCommand(x => grabarReporte());
                }
                return _cmdGuardar;
            }
        }

        RelayCommand _cmdEliminar;
        public ICommand cmdEliminar
        {
            get
            {
                if (_cmdEliminar == null)
                {
                    _cmdEliminar = new RelayCommand(x => eliminarRegistroReporte());
                }
                return _cmdEliminar;
            }
        }

        RelayCommand _cmdEliminarFila;
        public ICommand cmdEliminarFila
        {
            get
            {
                if (_cmdEliminarFila == null)
                {
                    _cmdEliminarFila = new RelayCommand(x => eliminarRegistroReporte());
                }
                return _cmdEliminarFila;
            }
        }

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {
                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(Salir);
                }
                return _cmdSalir;
            }
        }

        RelayCommand _cmdBuscarProcesosEspeciales;
        public ICommand cmdBuscarProcesosEspeciales
        {
            get
            {
                if (_cmdBuscarProcesosEspeciales == null)
                {
                    _cmdBuscarProcesosEspeciales = new RelayCommand(x => consultarProcesosEspeciales());
                }
                return _cmdBuscarProcesosEspeciales;
            }
        }

        RelayCommand _cmdBuscarEmpleados;
        public ICommand cmdBuscarEmpleados
        {
            get
            {
                if (_cmdBuscarEmpleados == null)
                {
                    _cmdBuscarEmpleados = new RelayCommand(x => consultarEmpleados());
                }
                return _cmdBuscarEmpleados;
            }
        }

        RelayCommand _cmdValReporte;
        public ICommand cmdValReporte
        {
            get
            {
                if (_cmdValReporte == null)
                {
                    _cmdValReporte = new RelayCommand(x => ValReporte());
                }
                return _cmdValReporte;
            }
        }

        RelayCommand _cmdDobleClic;
        public ICommand cmdDobleClic
        {
            get
            {
                if (_cmdDobleClic == null)
                {
                    _cmdDobleClic = new RelayCommand(r => dobleClic());
                }
                return _cmdDobleClic;
            }
        }

        #endregion

        #region Metodos

        void consultarSemana(string sw)
        {
            try
            {
                _semana = _repositorio.consultar_Semana(_semana, sw);
                base.OnPropertyChanged("semana");
                base.OnPropertyChanged("dtmDesde");
                base.OnPropertyChanged("dtmHasta");
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void consultarProcesos()
        {
            try
            {
                procesos = new CLSPRCPRD().listarProcesos();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void consultarEquipos(string strAño, string strSemana)
        {
            try
            {
                equipos = new CLSMAEEQU().ListarEquipos(strAño, strSemana);
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void nuevoReporte()
        {
            consultarSemana("I");
            base.OnPropertyChanged("semana");
            numSemanaActual = semana;
            lisempleados.Clear();
            lisReportesDeCorte.Clear();
            dtReportados.Clear();
            numPorcentajeRegistro = 0;
            numTotalOrdenes = 0;
        }

        public void grabarReporte()
        {
            //guardarReportesDeProduccion();
            try
            {
                List<CLSREPPRO> lstAgregar = (from nov in lisReportesDeCorte where nov.agregar.Equals(true) && nov.CANREP_RPP > 0 select nov.getReportesCorte()).ToList();
                List<CLSREPPRO> lstActualizar = (from nov in lisReportesDeCorte where nov.actualizar.Equals(true) && nov.CANREP_RPP > 0 select nov.getReportesCorte()).ToList();
                List<CLSREPPRO> lstEliminar = (from nov in lisReportesDeCorte where nov.eliminar.Equals(true) && nov.CANREP_RPP > 0 select nov.getReportesCorte()).ToList();

                List<CLSMAEEMPP> lstEmpleados = (from emp in lisempleados where emp.numPorcentaje > 0 select emp.getEmpleado()).ToList();

                if (_repositorio.guardarReportesDeProduccion(_semana.HASTA_SEM, _semana.NROSEM_SEM, _selproceso.CODPRC_PPR, lstEmpleados, "P", MDOgeneral.usuario, lstActualizar, lstEliminar, lstAgregar))
                {
                    msn.texto = "La información se grabo exitosamente.";
                    msn.tipo = true;
                    nuevoReporte();
                }
                else
                {
                    msn.texto = "La información no se pudo grabar.";
                    msn.tipo = false;
                }   
         
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        public void eliminarRegistroReporte()
        {
            try
            {
                if (selReportesDeCorte.agregar)
                {
                    lisReportesDeCorte.Remove(selReportesDeCorte);
                }
                else
                {
                    selReportesDeCorte.eliminar = !selReportesDeCorte.eliminar;
                }

                var numTot = lisReportesDeCorte.Where(x => !String.IsNullOrEmpty(x.NROORD_RPP)).Sum(y => y.CANREP_RPP);
                numTotalOrdenes = Convert.ToInt32(numTot);
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        public void Salir(Object frmformulario)
        {
            ((Window)frmformulario).Close();
        }

        void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            try
            {
                if (e.NewItems != null && e.NewItems.Count != 0)
                {
                    lisReportesDeCorte.Last().CONSEC_RPP = (from cust in lisReportesDeCorte select cust).Count() + numConsecutivo;

                    foreach (VMReportesCorte nov in e.NewItems)
                    {
                        nov.PropertyChanged += OnPropertyChanged;
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void OnCollectionChangedEmpleado(object sender, NotifyCollectionChangedEventArgs e)
        {
            try
            {
                if (e.NewItems != null && e.NewItems.Count != 0)
                {
                    lisempleados.Last().numConsecutivoEmp = (from emp in lisempleados select emp).Count() + numConsecutivoEmp;

                    foreach (VMEmpleados emp in e.NewItems)
                    {
                        emp.PropertyChanged += OnPropertyChanged;
                        emp.validarEmpleados += this.validarEmpleado;
                        emp.pidePorcentaje += devuelvePorcentaje;
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void OnVMReportesCortePropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            (sender as VMReportesCorte).VerifyPropertyName("NROORD_RPP");
            if (e.PropertyName == "NROORD_RPP") { }
        }

        void OnPropertyChanged(Object sender, PropertyChangedEventArgs e)
        {
            try
            {
                logValido = ((from nov in lisReportesDeCorte select nov).ToList().Count()) > 0 ? true : false;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void ValReporte()
        {
            try
            {
                //logValido = !lisReportesDeCorte.Any(x => x.IsValid == false);
                logValido = false;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void consultarProcesosEspeciales()
        {
            try
            {
                buscarProcesosEspeciales.IsOpen = true;
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        public void consultarEmpleados()
        {
            try
            {
                buscarEmpleado.IsOpen = true;
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        void OnBuscarProcesosEspecialesPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "IsOpen")
            {
                if (!buscarProcesosEspeciales.IsOpen)
                {
                    if (buscarProcesosEspeciales.gridBuscar.selLista != null)
                    {
                        if (selReportesDeCorte != null)
                        {
                            selReportesDeCorte.NROORD_RPP = buscarProcesosEspeciales.gridBuscar.selLista.strColumna1;
                        }
                    }
                }
            }

        }

        void OnBuscarEmpleadoPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "IsOpen")
            {
                if (!buscarEmpleado.IsOpen)
                {
                    if (buscarEmpleado.gridBuscar.selLista != null)
                    {
                        if (selempleados != null)
                        {
                            selempleados.strCodigoEmp = buscarEmpleado.gridBuscar.selLista.strColumna1;
                        }
                    }
                }
            }

        }

        void ConsultarReportesProduccion(string strEmpleado)
        {
            try
            {
                lisReportesCorte = _repositorio.consultarReporteProduccion(_semana.HASTA_SEM, _semana.NROSEM_SEM, _selproceso.CODPRC_PPR, strEmpleado, "P");

                if (lisReportesCorte.Count > 0)
                {
                    double numTotal = 0;
                    List<VMReportesCorte> all = (from nov in lisReportesCorte select new VMReportesCorte(nov)).ToList(); 
                    foreach (VMReportesCorte nv in all)
                    {
                        nv.agregar = false;
                        numTotal = numTotal + nv.CANREP_RPP;
                        nv.numPendiente = nv.CANORD_DOP - nv.CANREP_RPP;
                        nv.PropertyChanged += OnVMReportesCortePropertyChanged;
                        nv.PropertyChanged += OnPropertyChanged;
                    }

                    if (all.Count > 0)
                    {
                        lisReportesDeCorte = new ObservableCollection<VMReportesCorte>(all);
                        lisReportesDeCorte.CollectionChanged += OnCollectionChanged;
                        numTotalOrdenes = numTotal;
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private string validarRepCorte()
        {
            string StrDatoDevuelto = "";
            if (strNumerodeOrden != null)
            {
                if (strNumerodeOrden.Length > 4)
                {
                    var numReg = lisReportesDeCorte.Where(x => !String.IsNullOrEmpty(x.NROORD_RPP)).Count();

                    Int32 numCantidad = 0;
                    dtReportados = _repositorio.consultar_SiExisteOrdenReportada(strNumerodeOrden, selproceso.CODPRC_PPR, dtmDesde.Year, numSemanaActual, out numCantidad);

                    if (numCantidad <= 0)
                    {
                        numAReportar = numPendiente;
                    }

                    if (numCantidad == 0)
                    {
                        MessageBox.Show("Esta orden ya se reporto en su totalidad para este proceso.", "Orden ya Reportada", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                        StrDatoDevuelto = "Ya se reporto el cien porciento de la orden.";
                        limpiartextos();
                    }

                    int numTotal = lisReportesDeCorte.ToList().Count(x => !String.IsNullOrEmpty(x.NROORD_RPP) && x.NROORD_RPP.Trim().Equals(strNumerodeOrden.Trim()));
                    if (numTotal > 1)
                    {
                        StrConsulta = "SELECT CODPRC_PES, NOMPRC_PES FROM PRCESP WHERE CODPRC_PES = '" + strNumerodeOrden + "' ";
                        DtConsulta = MdoGeneral.consulta(StrConsulta);

                        if (DtConsulta.Rows.Count > 0)//FJRF - Agregamos el dato
                        {
                            //FJRF - No hacemos nada
                        }
                        else//FJRF - Dejamos la validacion
                        {
                            MessageBox.Show("Esta orden ya se ingreso con anterioridad.", "Orden ya Ingresada", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                            StrDatoDevuelto = "El número de orden digitada ya existe";
                            limpiartextos();
                        }
                    }
                }
            }
            return StrDatoDevuelto;
        }

        void agregarAReportes()
        {
            try
            {
                VMReportesCorte objRepPro = new VMReportesCorte();

                numConsecutivo = numConsecutivo + 1;
                objRepPro.NROORD_RPP = strNumerodeOrden;
                objRepPro.CODPRC_RPP = selproceso.CODPRC_PPR;
                objRepPro.CANORD_DOP = numTotalOrden;
                objRepPro.CANREP_RPP = numAReportar;
                objRepPro.ANO_RPP = dtmDesde.Year;
                objRepPro.SEM_RPP = numSemanaActual;
                objRepPro.CONSEC_RPP = numConsecutivo;
                objRepPro.strReferencia = strReferencia;
                objRepPro.strColor = strColor;
                objRepPro.numPendiente = numPendiente;
                if (logModificar == true)
                    objRepPro.actualizar = true;
                else
                    objRepPro.agregar = true;

                lisReportesDeCorte.Add(objRepPro);

                logModificar = false;

                // Orden la lista y muestra primero lo ultimo que se agrega
                var res = (from all in lisReportesDeCorte where all.CANREP_RPP > 0 select all).OrderByDescending(x => x.CONSEC_RPP).ToList();

                int numCuenta = 0;
                foreach (VMReportesCorte nv in res)
                {
                    numCuenta = numCuenta + 1;
                }
                lisReportesDeCorte = new ObservableCollection<VMReportesCorte>(res);
                lisReportesDeCorte.CollectionChanged += OnCollectionChanged;

                
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void agregarEmpleadosEquipo()
        {
            try
            {
                CLSMAEEMPP _emp = new CLSMAEEMPP();
                lisempleados.Clear();
                lisempleadosequipo = _emp.listaEmpleadosEquipo(selEquipo.CODSEC_EQU, selEquipo.CODEQU_EQU, dtmDesde.Year.ToString(), _semana.NROSEM_SEM.ToString());//FJRF - Se le agrega la semana y el año
                List<VMEmpleados> all = (from emp in lisempleadosequipo select new VMEmpleados(emp)).ToList();

                numPorcentajeRegistro=0;
                Int32 cuenta = 0;
                foreach (VMEmpleados emp in all) 
                {
                    emp.agregar = false;
                    cuenta = cuenta + 1;
                    numPorcentajeRegistro = numPorcentajeRegistro + emp.numPorcentaje;
                }
                lisempleados = new ObservableCollection<VMEmpleados>(all);
                //lisempleados.CollectionChanged += OnCollectionChangedEmpleado;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void limpiartextos()
        {
            try
            {
                strReferencia = "";
                strColor = "";
                numTotalOrden = 0;
                numPendiente = 0;
                numAReportar = 0;
                numAReportar2 = 0;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private string validarEmpleado(string strEmpleado)
        {
            string StrDatoDevuelto = null;
            if (strEmpleado != null)
            {
                if (strEmpleado.Length > 4)
                {

                    int numTotal = lisempleados.ToList().Count(x => !String.IsNullOrEmpty(x.strCodigoEmp) && x.agregar.Equals(true) && x.strCodigoEmp.Trim().Equals(strEmpleado.Trim()));
                    if (numTotal > 1)
                    {
                        StrDatoDevuelto = "El código de empleado digitado ya existe";
                    }

                    var numSuma = lisempleados.Where(x => !String.IsNullOrEmpty(x.strCodigoEmp)).Sum(y => y.numPorcentaje);
                    numPorcentajeRegistro = Convert.ToDecimal(numSuma);

                    // buscamos si ya se ingreso algo del usuario. Siempre y cuando solo haya un registro en la lista de usuarion
                     int numCantidad = lisempleados.ToList().Count(x => !String.IsNullOrEmpty(x.strCodigoEmp));
                     if (numCantidad == 1)
                     {
                         ConsultarReportesProduccion(strEmpleado);
                     }
                }
                else
                if (String.IsNullOrEmpty(strEmpleado))
                {
                    StrDatoDevuelto = "El código incompleto. Debe ser de 5 caracteres.";
                }
            }
            return StrDatoDevuelto;
        }

        public string devuelveProceso(string strProc)
        {
            try
            {
                if (selproceso != null)
                {
                    if (selproceso.CODPRC_PPR != null)
                        return selproceso.CODPRC_PPR;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        public decimal devuelvePorcentaje(string strCodigoCli)
        {
            try
            {
                return numPorcentajeRegistro;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return 0;
        }

        String StrConsulta = "";
        MDOgeneral MdoGeneral = new MDOgeneral();
        DataTable DtConsulta = new DataTable();

        void ConsultarOrdenOProcesoEspecial()
        {
            try
            {
                if (logModificar == false)
                {

                    DataTable dtResultado = _repositorio.consultar_OrdenOProcesoEspecial(strNumerodeOrden);

                    if (dtResultado.Rows[0][0].ToString().Trim() == "No existe")
                    {
                        limpiartextos();
                    }
                    else
                    {

                        int numTotal = lisReportesDeCorte.ToList().Count(x => x.CANREP_RPP > 0 && x.NROORD_RPP.Trim().Equals(strNumerodeOrden) && (x.agregar == true || x.actualizar == true));
                        if (numTotal > 0)
                        {
                            StrConsulta = "SELECT CODPRC_PES, NOMPRC_PES FROM PRCESP WHERE CODPRC_PES = '" + strNumerodeOrden + "' ";
                            DtConsulta = MdoGeneral.consulta(StrConsulta);

                            if (DtConsulta.Rows.Count > 0)//FJRF - Agregamos el dato
                            {
                                #region FJRF - Hacemos lo que estaba haciendo antes
                                string strValida = null;

                                strValida = validarRepCorte();

                                if (String.IsNullOrEmpty(strValida))
                                {
                                    logAgregaReporte = true;
                                    if (strNumerodeOrden.Length == 5)
                                    {
                                        strReferencia = dtResultado.Rows[0][0].ToString().Trim();
                                        strColor = dtResultado.Rows[0][1].ToString();
                                        numTotalOrden = Convert.ToInt32(dtResultado.Rows[0][2]);
                                        numPendiente = numTotalOrden;
                                        numAReportar = 0;
                                    }
                                    else
                                    {
                                        ConsultarPendiente();
                                        if (numPendiente > 0)
                                        {
                                            strReferencia = dtResultado.Rows[0][0].ToString();
                                            strColor = dtResultado.Rows[0][1].ToString();
                                            numTotalOrden = Convert.ToInt32(dtResultado.Rows[0][2]);
                                            numAReportar = numPendiente;
                                        }
                                    }
                                }
                                #endregion
                            }
                            else//FJRF - Si no tiene datos realizamos la validacion
                            {
                                MessageBox.Show("La Orden: " + strNumerodeOrden + " ya fue ingresada.", "No sepuede ingresar", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                                strNumerodeOrden = "";
                            }
                        }
                        else
                        {
                            string strValida = null;

                            strValida = validarRepCorte();

                            if (String.IsNullOrEmpty(strValida))
                            {
                                logAgregaReporte = true;
                                if (strNumerodeOrden.Length == 5)
                                {
                                    strReferencia = dtResultado.Rows[0][0].ToString().Trim();
                                    strColor = dtResultado.Rows[0][1].ToString();
                                    numTotalOrden = Convert.ToInt32(dtResultado.Rows[0][2]);
                                    numPendiente = numTotalOrden;
                                    numAReportar = 0;
                                }
                                else
                                {
                                    ConsultarPendiente();
                                    if (numPendiente > 0)
                                    {
                                        strReferencia = dtResultado.Rows[0][0].ToString();
                                        strColor = dtResultado.Rows[0][1].ToString();
                                        numTotalOrden = Convert.ToInt32(dtResultado.Rows[0][2]);
                                        numAReportar = numPendiente;
                                    }
                                }
                            }
                        }
                    }
                    base.OnPropertyChanged("strReferencia");
                    base.OnPropertyChanged("strColor");
                    base.OnPropertyChanged("numTotalOrden");
                    base.OnPropertyChanged("numPendiente");
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void ConsultarPendiente()
        {
            try
            {
                numPendiente = 0;
                Int32 numPendienteX = _repositorio.consultar_Pendiente(strNumerodeOrden, selproceso.CODPRC_PPR);
                if (numPendienteX > 0)
                {
                    numPendiente = numPendienteX;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void dobleClic()
        {
            try
            {
                if (selReportesDeCorte != null)
                {
                    if (selReportesDeCorte.agregar==false)
                        logModificar = true;

                    strNumerodeOrden = selReportesDeCorte.NROORD_RPP;
                    strReferencia = selReportesDeCorte.strReferencia;
                    strColor = selReportesDeCorte.strColor;
                    numTotalOrden = selReportesDeCorte.CANORD_DOP;
                    numPendiente = selReportesDeCorte.CANREP_RPP;
                    numAReportar = selReportesDeCorte.CANREP_RPP;

                    lisReportesDeCorte.Remove(selReportesDeCorte);
                    logAgregaReporte = true;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

        /// <summary>
        /// Returns true if this object has no validation errors.
        /// </summary>
        /// 

        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                    if (GetValidationError(property) != null)
                        return false;

                return true;
            }
        }

        static readonly string[] ValidatedProperties = 
            { 
                "semana",
                "dtmDesde",
                "dtmHasta",
                "selproceso",
                "tipoSeleccion",
                "numControlGrid",
                "numPorcentajeRegistro"
            };

        string GetValidationError(string propertyName)
        {
            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            string error = null;

            switch (propertyName)
            {
                case "semana":
                    error = this.ValidateSemana();
                    break;
                case "dtmDesde":
                    error = this.ValidateDesde();
                    break;
                case "dtmHasta":
                    error = this.ValidateHasta();
                    break;
                case "selproceso":
                    error = this.ValidateProceso();
                    break;
                case "tipoSeleccion":
                    error = this.ValidateTipodeSeleccion();
                    break;
                case "numControlGrid":
                    error = this.ValidateOrdenes();
                    break;
                case "numPorcentajeRegistro":
                    error = this.ValidatePorcentaje();
                    break;
                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }
            return error;
        }

        string ValidateSemana()
        {
            try
            {
                if (semana <= 0 || semana > 52) { return "Debe ingresar una semana valida"; }
                if (semana > numSemanaActual) { return "La semana digitada no puede ser superior a la semana actual"; }
                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        string ValidateDesde()
        {
            try
            {
                if (dtmDesde > dtmHasta) { return "La fecha inicial debe ser menor o igual que la fecha final."; }
                TimeSpan ts = dtmHasta.Subtract(dtmDesde);
                if (ts.Days > 7) { return "El rango de fechas no debe de ser mayor a una semana."; }

                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        string ValidateHasta()
        {
            try
            {
                if (dtmHasta < dtmDesde) { return "La fecha final debe ser mayor o igual que la fecha inicial"; }
                TimeSpan ts = dtmHasta.Subtract(dtmDesde);
                if (ts.Days > 7) { return "El rango de fechas no debe de ser mayor a una semana."; }

                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        string ValidateProceso()
        {
            try
            {
                if (selproceso == null) { return "Debe seleccionar algun proceso."; }

                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        string ValidateTipodeSeleccion()
        {
            try
            {
                Int32 numTotReg = 0;
                if (tipoSeleccion == "Empleados")
                {
                    numTotReg = lisempleados.ToList().Count(x => !String.IsNullOrEmpty(x.strCodigoEmp) && x.strCodigoEmp.Trim().Equals(selempleados.strCodigoEmp.Trim()));
                    if (numTotReg > 1) { return "El empleado ya fue ingresado con anterioridad."; }

                    numTotReg = lisempleados.ToList().Count(x => !String.IsNullOrEmpty(x.strCodigoEmp));
                    if (numTotReg == 0) { return "Falta ingresar empleados"; }

                    return null;
                }
                else
                {
                    if (selEquipo == null) { return "Debe seleccionar algun Equipo de trabajo."; }
                    return null;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        string ValidateOrdenes()
        {
            try
            {
                if (numControlGrid == 0) { return "Falta ingresar ordenes"; }

                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        string ValidatePorcentaje()
        {
            try
            {
                if (numPorcentajeRegistro < 100) { return "El porcentaje siempre debe ser del 100 por ciento"; }

                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        #endregion
    }

    #region Clase VMReportesCorte
    public class VMReportesCorte : ViewModelBase
    {
        #region Campos
        private CLSREPPRO _reportesCorte = new CLSREPPRO();
        private ProcesoProduccionRepositorio _repCorte = new ProcesoProduccionRepositorio();
        #endregion

        #region constructor
        public VMReportesCorte(CLSREPPRO reportesCorte)
        {
            _reportesCorte = reportesCorte;
        }

        public VMReportesCorte()
        {

        }
        #endregion

        #region Interfaces publicas o propiedades
        public int ANO_RPP
        {
            get { return _reportesCorte.ANO_RPP; }
            set { _reportesCorte.ANO_RPP = value; base.OnPropertyChanged("ANO_RPP"); }
        }

        public int SEM_RPP
        {
            get { return _reportesCorte.SEM_RPP; }
            set { _reportesCorte.SEM_RPP = value; base.OnPropertyChanged("SEM_RPP"); }
        }

        public string CODPRC_RPP
        {
            get { return _reportesCorte.CODPRC_RPP; }
            set { _reportesCorte.CODPRC_RPP = value; base.OnPropertyChanged("CODPRC_RPP"); }
        }

        public string NROORD_RPP
        {
            get { return _reportesCorte.NROORD_RPP; }
            set { _reportesCorte.NROORD_RPP = value; base.OnPropertyChanged("NROORD_RPP"); }
        }

        public int CONSEC_RPP
        {
            get { return _reportesCorte.CONSEC_RPP; }
            set { _reportesCorte.CONSEC_RPP = value; base.OnPropertyChanged("CONSEC_RPP"); }
        }

        public string strReferencia
        {
            get { return _reportesCorte.referencia.NOMREF_REF; }
            set { _reportesCorte.referencia.NOMREF_REF = value; base.OnPropertyChanged("strReferencia"); }
        }

        public string strColor
        {
            get { return _reportesCorte.color.NOMCOL_COL; }
            set { _reportesCorte.color.NOMCOL_COL = value; base.OnPropertyChanged("strColor"); }
        }

        public double CANREP_RPP
        {
            get { return Convert.ToDouble(_reportesCorte.CANREP_RPP); }
            set { _reportesCorte.CANREP_RPP = value; base.OnPropertyChanged("CANREP_RPP"); }
        }

        public Int32 CANORD_DOP
        {
            get { return _reportesCorte.detalleOrdenes.CANORD_DOP; }
            set { _reportesCorte.detalleOrdenes.CANORD_DOP = value; base.OnPropertyChanged("CANORD_DOP"); }
        }

        private double _numPendiente = 0;
        public double numPendiente
        {
            get { return _numPendiente; }
            set { _numPendiente = value; base.OnPropertyChanged("numPendiente"); }
        }

        public double PORCEN_RPP
        {
            get { return _reportesCorte.PORCEN_RPP; }
            set { _reportesCorte.PORCEN_RPP = value; base.OnPropertyChanged("PORCEN_RPP"); }
        }

        public double VLRVLR_RPP
        {
            get { return _reportesCorte.VLRVLR_RPP; }
            set { _reportesCorte.VLRVLR_RPP = value; base.OnPropertyChanged("VLRVLR_RPP"); }
        }

        public double VLRCTG_RPP
        {
            get { return _reportesCorte.VLRCTG_RPP; }
            set { _reportesCorte.VLRCTG_RPP = value; base.OnPropertyChanged("VLRCTG_RPP"); }
        }

        public string ESTADO_RPP
        {
            get { return _reportesCorte.ESTADO_RPP; }
            set { _reportesCorte.ESTADO_RPP = value; base.OnPropertyChanged("ESTADO_RPP"); }
        }

        private string _strProceso;
        public string strProceso
        {
            get { return _strProceso; }
            set { _strProceso = value; base.OnPropertyChanged("strProceso"); }
        }

        private bool _actualizar = false;
        public bool actualizar
        {
            get { return _actualizar; }
            set { _actualizar = value; base.OnPropertyChanged("actualizar"); }
        }

        private bool _eliminar = false;
        public bool eliminar
        {
            get { return _eliminar; }
            set { _eliminar = value; base.OnPropertyChanged("eliminar"); }
        }

        private bool _agregar = false;
        public bool agregar
        {
            get { return _agregar; }
            set { _agregar = value; base.OnPropertyChanged("agregar"); }
        }

        #endregion

        #region metodos
        public CLSREPPRO getReportesCorte()
        {
            return _reportesCorte;
        }
        #endregion
    }
    #endregion

    #region Clase VMEmpleados
    public class VMEmpleados : ViewModelBase, IDataErrorInfo
    {
        #region Campos
        private CLSMAEEMPP _empleados = new CLSMAEEMPP();
        private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();
        #endregion

        #region constructor
        public VMEmpleados(CLSMAEEMPP empleados, ValidarEmpleados _validarEmpleados)
        {
            _empleados = empleados;
            validarEmpleados += _validarEmpleados;
        }
        public VMEmpleados(CLSMAEEMPP empleados)
        {
            _empleados = empleados;
        }
        public VMEmpleados()
        {
            agregar = true;
        }
        #endregion

        #region Interfaces publicas o propiedades
        public ValidarEmpleados validarEmpleados { get; set; }
        public PidePorcentaje pidePorcentaje { get; set; }

        public string strCodigoEmp
        {
            get { return _empleados.CODEMP_EMP; }
            set
            {
                _empleados.CODEMP_EMP = value;
                if (agregar == true)
                {
                    _empleados.consultar();
                    if (_empleados.EXISTE == true)
                    {
                        decimal numPorc = this.pidePorcentaje(strCodigoEmp);
                        strNombreEmp = _empleados.NOMEMP_EMP;
                        _empleados.numPorcentaje = 100 - numPorc;
                        numPorcentaje = 100 - numPorc;
                    }
                }
                base.OnPropertyChanged("strCodigoEmp");
            }
        }

        public string strNombreEmp
        {
            get { return _empleados.NOMEMP_EMP; }
            set { _empleados.NOMEMP_EMP = value; base.OnPropertyChanged("strNombreEmp");  }
        }

        public decimal numPorcentaje
        {
            get { return _empleados.numPorcentaje; }
            set { _empleados.numPorcentaje = value; base.OnPropertyChanged("numPorcentaje"); }
        }

        public int numConsecutivoEmp
        {
            get { return _empleados.numConsecutivo; }
            set { _empleados.numConsecutivo = value; base.OnPropertyChanged("numConsecutivoEmp"); }
        }

        public string strTelefonoEmp
        {
            get { return _empleados.TELEMP_EMP; }
            set { _empleados.TELEMP_EMP = value; base.OnPropertyChanged("strTelefonoEmp"); }
        }

        public string strCedulaEmp
        {
            get { return _empleados.CEDEMP_EMP; }
            set { _empleados.CEDEMP_EMP = value; base.OnPropertyChanged("strCedulaEmp"); }
        }

        public string strSeccionEmp
        {
            get { return _empleados.SECEMP_EMP; }
            set { _empleados.SECEMP_EMP = value; base.OnPropertyChanged("strSeccionEmp"); }
        }

        public string strTipoEmp
        {
            get { return _empleados.TIPEMP_EMP; }
            set { _empleados.TIPEMP_EMP = value; base.OnPropertyChanged("strTipoEmp"); }
        }

        public string strDireccionEmp
        {
            get { return _empleados.DIREMP_EMP; }
            set { _empleados.DIREMP_EMP = value; base.OnPropertyChanged("strDireccionEmp"); }
        }

        public string strTipoGuaEmp
        {
            get { return _empleados.TIPGUA_EMP; }
            set { _empleados.TIPGUA_EMP = value; base.OnPropertyChanged("strTipoGuaEmp"); }
        }

        public string strEstadoEmp
        {
            get { return _empleados.ESTADO_EMP; }
            set { _empleados.ESTADO_EMP = value; base.OnPropertyChanged("strEstadoEmp"); }
        }

        public int numBasicoEmp
        {
            get { return _empleados.BASICO_EMP; }
            set { _empleados.BASICO_EMP = value; base.OnPropertyChanged("numBasicoEmp"); }
        }

        public int numIncFloEmp
        {
            get { return _empleados.INCFLO_EMP; }
            set { _empleados.INCFLO_EMP = value; base.OnPropertyChanged("numIncFloEmp"); }
        }


        public int numLm1FlgEmp
        {
            get { return _empleados.LM1FLG_EMP; }
            set { _empleados.LM1FLG_EMP = value; base.OnPropertyChanged("numLm1FlgEmp"); }
        }

        public int numLm2FlgEmp
        {
            get { return _empleados.LM2FLG_EMP; }
            set { _empleados.LM2FLG_EMP = value; base.OnPropertyChanged("numLm2FlgEmp"); }
        }

        public int numLm3FlgEmp
        {
            get { return _empleados.LM3FLG_EMP; }
            set { _empleados.LM3FLG_EMP = value; base.OnPropertyChanged("numLm3FlgEmp"); }
        }

        public int numIn1FlgEmp
        {
            get { return _empleados.IN1FLG_EMP; }
            set { _empleados.IN1FLG_EMP = value; base.OnPropertyChanged("numIn1FlgEmp"); }
        }

        public int numIn2FlgEmp
        {
            get { return _empleados.IN2FLG_EMP; }
            set { _empleados.IN2FLG_EMP = value; base.OnPropertyChanged("numIn2FlgEmp"); }
        }

        public int numIn3FlgEmp
        {
            get { return _empleados.IN3FLG_EMP; }
            set { _empleados.IN3FLG_EMP = value; base.OnPropertyChanged("numIn3FlgEmp"); }
        }

        private bool _actualizar = false;
        public bool actualizar
        {
            get { return _actualizar; }
            set { _actualizar = value; base.OnPropertyChanged("actualizar"); }
        }

        private bool _eliminar = false;
        public bool eliminar
        {
            get { return _eliminar; }
            set { _eliminar = value; base.OnPropertyChanged("eliminar"); }
        }

        private bool _agregar = false;
        public bool agregar
        {
            get { return _agregar; }
            set { _agregar = value; base.OnPropertyChanged("agregar"); }
        }

        #endregion

        #region metodos

        public delegate string ValidarEmpleados(string empleados);
        public delegate decimal PidePorcentaje(string strCodigoEmp);


        public CLSMAEEMPP getEmpleado()
        {
            return _empleados;
        }
        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

        /// <summary>
        /// Returns true if this object has no validation errors.
        /// </summary>
        /// 

        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                    if (GetValidationError(property) != null)
                        return false;

                return true;
            }
        }

        static readonly string[] ValidatedProperties = 
        { 
            "strCodigoEmp",
            "numPorcentaje"
        };

        string GetValidationError(string propertyName)
        {
            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            string error = null;

            switch (propertyName)
            {
                case "strCodigoEmp":
                    error = this.ValidateCodigo();
                    break;
                case "numPorcentaje":
                    error = this.ValidatePorcentaje();
                    break;
                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }
            return error;
        }

        string ValidateCodigo()
        {
            try
            {
                if (agregar == true || actualizar == true)
                {
                    string error = null;
                    if (strCodigoEmp == null)
                    {
                        if (numPorcentaje > 0)
                        {
                            return "Debe ingresar el código del empleado.";
                        }
                    }
                    else
                    {
                        if (strCodigoEmp.Length == 5)
                        {
                            if (strNombreEmp != null)
                            {
                                if (strNombreEmp.Length > 1)
                                {
                                    error = validarEmpleados(strCodigoEmp);
                                    if (!String.IsNullOrEmpty(error)) { return error; }
                                }
                                else
                                    return "Codigo de empleado no existe.";
                            }
                            else
                                return "Codigo de empleado no existe.";
                        }
                        else
                        {
                            if (strCodigoEmp.Length > 0)
                                return "Codigo de empleado no existe.";
                        }
                    }
                }
                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        string ValidatePorcentaje()
        {
            try
            {
                if (agregar == true || actualizar == true)
                {
                    string error = null;
                    if (strCodigoEmp == null)
                    {
                        if (numPorcentaje > 0)
                        {
                            return "Debe ingresar el código del empleado.";
                        }
                    }
                    else
                    {
                        if (numPorcentaje == 0)
                        {
                            return "El porcentaje debe estar entre 1 y 100.";
                        }
                        else
                        {
                            error = validarEmpleados(strCodigoEmp);
                            if (!String.IsNullOrEmpty(error)) { return error; }
                        }
                    }
                }
                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        #endregion
    }
    #endregion

}
